package ocio.actions;

import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import ocio.beans.Admin;
import ocio.beans.Cliente;
import ocio.beans.Producto;
import ocio.beans.Proveedor;
import ocio.beans.Reserva;
import ocio.beans.Subscripcion;
import ocio.beans.Usuario;
import ocio.services.AdminService;
import ocio.services.ClienteService;
import ocio.services.ProveedorService;
import ocio.services.ServiceLocator;
import ocio.services.UsuarioService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase destinataria de la petición de información sobre un usuario.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Usuario
 */
public class MiCuentaAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private int id;
	private Admin admin;
	private Cliente cliente;
	private Proveedor proveedor;
	private Date fechahoy;

	private Set<Reserva> listaReservas = new HashSet<Reserva>();
	private Set<Producto> listaProductos = new HashSet<Producto>();
	private Set<Subscripcion> listaSubscripciones = new HashSet<Subscripcion>();
	
	private int rol;	
	
	
   /**
	 * Método execute() de la clase ActionSupport de Struts 2. 
	 * Solicita los servicios para recuperar toda la información asociada a un usuario.
	 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario.
	 */
	public String execute(){
		
		if (id==0){
			Map<String,Object> sesion = ActionContext.getContext().getSession();
			id =(Integer) sesion.get("USUARIO");
		}
		
		fechahoy=new Date();

		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();		
		UsuarioService usuarioService = (UsuarioService)serviceLocator.getService("Usuario");		
		Usuario usuario =(Usuario)usuarioService.searchById(id);
		this.setRol(usuario.getRol());
		
		switch (rol) {
    	case 1: 
    		AdminService adminService = (AdminService)serviceLocator.getService("Admin");		
    		admin = (Admin)adminService.searchById(usuario.getId());
    		Map<String,Object> sesion = ActionContext.getContext().getSession();
    		sesion.remove("IDPROVEEDOR"); //si venía de consultar otro proveedor y cliente, ahora, al ver
    		sesion.remove("IDCLIENTE"); //su cuenta, él actúa como proveedor y cliente.
    		sesion.put("IDPROVEEDOR",admin.getId());
    		sesion.put("IDCLIENTE",admin.getId());
    		listaReservas = admin.getReservas();
    		listaSubscripciones = admin.getSubscripciones();
    		listaProductos = admin.getProductos();
            break;
    	case 2: 
    		ClienteService clienteService = (ClienteService)serviceLocator.getService("Cliente");		
    		cliente = (Cliente)clienteService.searchById(usuario.getId()); 
    		listaReservas = cliente.getReservas();
    		listaSubscripciones = cliente.getSubscripciones();
    		break;
    	case 3:  
    		ProveedorService proveedorService = (ProveedorService)serviceLocator.getService("Proveedor");		
    		proveedor = (Proveedor)proveedorService.searchById(usuario.getId());
    		listaProductos = proveedor.getProductos();
    		break;
	}

		return "success";
	}
	
		
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}


	public Admin getAdmin() {
		return admin;
	}


	public void setAdmin(Admin admin) {
		this.admin = admin;
	}


	public Cliente getCliente() {
		return cliente;
	}


	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}


	public Proveedor getProveedor() {
		return proveedor;
	}


	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}


	public Set<Reserva> getListaReservas() {
		return listaReservas;
	}


	public void setListaReservas(Set<Reserva> listaReservas) {
		this.listaReservas = listaReservas;
	}


	public Set<Producto> getListaProductos() {
		return listaProductos;
	}


	public void setListaProductos(Set<Producto> listaProductos) {
		this.listaProductos = listaProductos;
	}


	public Set<Subscripcion> getListaSubscripciones() {
		return listaSubscripciones;
	}


	public void setListaSubscripciones(Set<Subscripcion> listaSubscripciones) {
		this.listaSubscripciones = listaSubscripciones;
	}


	public int getRol() {
		return rol;
	}


	public void setRol(int rol) {
		this.rol = rol;
	}


	public Date getFechahoy() {
		return fechahoy;
	}


	public void setFechahoy(Date fechahoy) {
		this.fechahoy = fechahoy;
	}
	
}
